home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
a_utils
/
ffccflow
/
ffccflow.lha
/
ffccc+flow
/
ffccc
/
PROCES.f
< prev
next >
Wrap
Text File
|
1992-07-31
|
9KB
|
218 lines
SUBROUTINE PROCES
*-----------------------------------------------------------------------
*
* Processes one routine statement by statement:
* filtering, replacements
*
*-----------------------------------------------------------------------
include 'PARAM.h'
include 'ALCAZA.h'
include 'CLASS.h'
include 'FLAGS.h'
include 'CURSTA.h'
include 'STATE.h'
include 'JOBSUM.h'
LOGICAL SAMEST
*--- treat routine header and init
CALL RSTART
*--- TREE preparation if no proper header
IF(ACTION(29).AND.SCROUT.EQ.'NOHEADER') CALL TREEST(0)
*--- user top of routine
IF(ACTION(22)) CALL URINIT
*--- NP controls the number of blank lines for print headers
NP=0
*--- process only if routine selected
IF (STATUS(7)) THEN
*--- loop over all statements in routine
DO 60 IST=1,NSTAMM
STATUS(8)=.TRUE.
STATUS(10)=.TRUE.
STATUS(11)=.FALSE.
IF (ICLASS(IST,1).GT.0) THEN
*--- extract and set classes
CALL EXTRAC(IST,'FULL')
ICURCL(1)=ICLASS(IST,1)
ICURCL(2)=ICLASS(IST,2)
IF (ICURCL(1).EQ.ILL) NFDCLS(ILL,1)=NFDCLS(ILL,1)+1
ENDIF
IF (ICLASS(IST,1).EQ.ILL.AND.ACTION(3)) THEN
IF (STATUS(9)) THEN
STATUS(9)=.FALSE.
IF (ACTION(6)) THEN
WRITE (MPUNIT,10000) 'all',SCROUT
ELSE
WRITE (MPUNIT,10000) 'selected',SCROUT
ENDIF
ENDIF
STATUS(10)=.FALSE.
CALL FLPRNT(1,'illegal',NLLINE(IST)-NFLINE(IST)+1,SIMA(
+ NFLINE(IST)),NSTATC(8))
NP=1
*--- print all if requested
ELSEIF (ACTION(6)) THEN
*--- routine header
IF (STATUS(9)) THEN
STATUS(9)=.FALSE.
WRITE (MPUNIT,10000) 'all',SCROUT
ENDIF
STATUS(10)=.FALSE.
CALL FLPRNT(NP,' ',NLLINE(IST)-NFLINE(IST)+1,SIMA(NFLINE(
+ IST)),NSTATC(8))
NP=0
ENDIF
*--- call user routine for ALL statements
IF(ACTION(22)) CALL USSALL
*--- process only legal FORTRAN statements
IF (ICLASS(IST,1).GT.0.AND.ICLASS(IST,1).NE.ILL) THEN
*--- get statement number
SNEWST(1)(1:6)=SIMA(NFLINE(IST))(1:6)
*--- filter for classes
IF (ACTION(17)) CALL FILTER(13,8)
IF (STATUS(8)) THEN
*--- get statement names
ISNAME=IRNAME+NRNAME
CALL GETALL
*--- filter for names
IF (ACTION(18)) CALL FILTER(11,8)
IF (STATUS(8)) THEN
*--- filter for strings
IF (ACTION(19)) CALL FILTER(12,8)
IF (STATUS(8)) THEN
*--- all filters passed - update statistics
IMODIF(IST)=1
NSTATC(4)=NSTATC(4)+1
NFDCLS(ICURCL(1),1)=NFDCLS(ICURCL(1),1)+1
IF (ICURCL(1).EQ.IIF) NFDCLS(ICURCL(2),2)=NFDCLS
+ (ICURCL(2),2)+1
*--- user start of statement
IF(ACTION(22)) CALL USSBEG
*--- prepare indentation if requested
IF(ACTION(21)) CALL PROIND
*----get type for variables
IF (ACTION(20)) CALL SETTYP(1)
*--- check for incorrect relational operators in character type
CALL CHKCHR
*--- treat names further if any
IF(NSNAME.GT.0) THEN
*--- prepare TREE output
IF(ACTION(29)) CALL TREEST(1)
*--- find used and unused common blocks
IF(ACTION(24).AND..NOT.STATUS(12))
+ CALL PROCOM
*--- perform name replacements
IF (ACTION(15)) CALL REPNAM
IF (STATUS(11)) GOTO 10
IF (ACTION(1).OR.ACTION(2)) THEN
*--- add names to routine name list
CALL LSORT(SNAMES(ISNAME+1),
+ NAMTYP(ISNAME+1),.TRUE.,NSNAME)
CALL LMERGE(SNAMES,NAMTYP,.TRUE.,IRNAME,
+ NRNAME,NSNAME)
CALL SUPMOR(SNAMES,NAMTYP,.TRUE.,IRNAME,
+ NRNAME+NSNAME,NRNAME)
ENDIF
ENDIF
IF (ACTION(5).AND.STATUS(10)) THEN
*--- print filtered
IF (STATUS(9)) THEN
WRITE (MPUNIT,10000) 'filtered',SCROUT
STATUS(9)=.FALSE.
ENDIF
STATUS(10)=.FALSE.
CALL FLPRNT(NP,' ',NLLINE(IST)-NFLINE(IST)+1,
+ SIMA(NFLINE(IST)),NSTATC(8))
NP=0
ENDIF
IF (ACTION(11).OR.ACTION(12)) THEN
*--- remove {} , change holl. to quotes if requested
CALL QUOSUB
IF (STATUS(11)) GOTO 10
*--- string replacement
IF(ACTION(12)) CALL REPSTR
IF (STATUS(11)) GOTO 10
*--- re-insert {} around strings for REFORM
CALL MARKST('FULL',IERR)
STATUS(11)=IERR.NE.0
IF (STATUS(11)) GOTO 10
ENDIF
*--- re-numbering if requested
IF (ACTION(13)) CALL RENUMB
*--- user end of statement
IF(ACTION(22)) CALL USSEND
ENDIF
ENDIF
ENDIF
*--- here you arrive without filter checks
10 CONTINUE
IFILTR=0
IF (STATUS(11)) IMODIF(IST)=MOD(IMODIF(IST),10)
*--- reformat = put modified statement into SIMA
IF (IMODIF(IST).GT.10.OR.ACTION(21).AND.IMODIF(IST).GT.0)
+ THEN
CALL REFORM
*--- not changed if REFORM problem, or identical after REFORM
IF (STATUS(11).OR.SAMEST(IST))
+ IMODIF(IST)=MOD(IMODIF(IST),10)
ENDIF
IF (IMODIF(IST).GT.10) THEN
*--- count changed statements
NSTATC(5)=NSTATC(5)+1
IF (ACTION(4).AND.STATUS(10)) THEN
*--- print changed statements
IF (STATUS(9)) THEN
WRITE (MPUNIT,10000) 'changed',SCROUT
STATUS(9)=.FALSE.
ENDIF
CALL FLPRNT(1,' ',NLLINE(IST)-NFLINE(IST)+1,SIMA(
+ NFLINE(IST)),NSTATC(8))
ENDIF
*--- re-formatted statement in SNEWST
* put into SIMA, push SIMA if new longer than old, introduce blank
* lines if new shorter than old
N=0
DO 20 I=NFLINE(IST),NLLINE(IST)
IF (NLTYPE(I).NE.0) THEN
N=N+1
IF (N.GT.NEWOUT) THEN
SIMA(I)=' '
ELSE
SIMA(I)=SNEWST(N)
ENDIF
ENDIF
20 CONTINUE
NPUSH=NEWOUT-N
IF (NPUSH.GT.0) THEN
DO 30 I=NLINES,NLLINE(IST)+1,-1
NLTYPE(I+NPUSH)=NLTYPE(I)
SIMA(I+NPUSH)=SIMA(I)
30 CONTINUE
NLINES=NLINES+NPUSH
*--- loop over all statements since they might be in a different order
DO 40 I=1,NSTAMM
IF(NFLINE(I).GT.NFLINE(IST)) THEN
NFLINE(I)=NFLINE(I)+NPUSH
NLLINE(I)=NLLINE(I)+NPUSH
ENDIF
40 CONTINUE
DO 50 I=1,NPUSH
SIMA(NLLINE(IST)+I)=SNEWST(N+I)
50 CONTINUE
NLLINE(IST)=NLLINE(IST)+NPUSH
ENDIF
IF (ACTION(4)) THEN
CALL FLPRNT(0,'changed to',NLLINE(IST)-NFLINE(IST)+
+ 1,SIMA(NFLINE(IST)),NDUMMY)
NP=1
ENDIF
ENDIF
ENDIF
60 CONTINUE
ENDIF
*--- user end of routine
IF(ACTION(22)) CALL URTERM
*--- TREE output if any
IF(ACTION(29)) CALL TREESU
10000 FORMAT(/1X,20('++++'),A10,' statements, routine =',A10)
999 END